클라우드를 활용한 쿠버네티스 인프라 구축 과정

클라우드 환경에서 서버를 구성했으며 Bastion Host 서버와 ALB는 Public Subnet, k8s 리소스들은 Private Subnet에 위치한다.
Master node 1개 / Worker node 2개로 구성
1. 시스템 기본 설정
1) swap 메모리를 비활성화한다. 쿠버네티스는 자체적으로 메모리를 관리하므로, swap이 활성화된 상태로 운영하면 성능 저하가 발생할 수 있다.
swapoff -a
# 이 명령어는 시스템의 모든 swap 공간을 즉시 비활성화한다. 메모리 페이지를 물리적 RAM으로 강제 이동시킨다.
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# /etc/fstab 파일에서 swap 관련 라인을 찾아 주석 처리한다. 시스템 재부팅 후에도 swap이 비활성화 상태를 유지하게 한다.
2) 컨테이너 네트워킹에 필요한 커널 모듈을 활성화한다.
overlay 모듈은 컨테이너 이미지의 레이어드 파일시스템을 구현하는 데 사용된다.
br_netfilter 모듈은 컨테이너 간 네트워크 통신을 위한 브리지(브릿지) 네트워크 필터링을 담당한다.
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
# 시스템 시작 시 자동으로 로드할 커널 모듈을 지정하는 설정 파일을 생성한다. | tee 명령어로 출력을 파일에 저장한다.
modprobe overlay
modprobe br_netfilter
# 지정된 커널 모듈을 즉시 로드한다. modprobe는 모듈의 의존성도 함께 처리한다.
3) 쿠버네티스 네트워크 통신을 위한 커널 매개변수를 설정한다.
브리지 네트워크를 통과하는 패킷을 iptables로 제어하고, 노드 간 패킷 포워딩을 활성화하여 클러스터 내 통신이 원활하게 이루어지도록 한다.
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 커널 네트워크 매개변수를 설정하는 파일을 생성한다. 브리지 네트워크와 IP 포워딩을 활성화한다.
sysctl --system
# 시스템의 모든 sysctl 설정을 다시 로드하여 새로운 네트워크 매개변수를 적용한다.
2. containerd 설정
containerd의 기본 설정 파일을 생성하고, systemd cgroup 드라이버를 사용하도록 설정한다. 이는 컨테이너 런타임과 쿠버네티스의 리소스 관리 통합을 위해 필요하다.
containerd config default > /etc/containerd/config.toml
# containerd의 기본 설정을 생성하여 파일로 저장한다. 모든 기본 매개변수가 포함된 설정 파일이 생성된다.
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
# 설정 파일에서 SystemdCgroup 값을 false에서 true로 변경한다. systemd의 cgroup 관리 기능을 활성화한다.
systemctl restart containerd
# containerd 서비스를 재시작하여 새로운 설정을 적용한다.
3. 쿠버네티스 패키지 설치
kubeadm: 클러스터 구성 도구
kubelet: 각 노드에서 실행되는 에이전트
kubectl: 클러스터 관리를 위한 명령줄 도구
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# 쿠버네티스 저장소의 GPG 키를 다운로드하고 시스템의 키링에 추가한다. 패키지 인증에 사용된다.
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 쿠버네티스 패키지 저장소를 시스템의 소스 목록에 추가한다. GPG 키로 서명된 패키지만 허용한다.
apt-get update
apt-get install -y kubelet kubeadm kubectl
# 패키지 목록을 업데이트하고 쿠버네티스 핵심 컴포넌트를 설치한다. -y 옵션으로 자동 승인한다.
여기까지 모든 노드에 공통 적용
4. 마스터 노드 초기화
Pod 네트워크 CIDR을 지정하여 클러스터를 초기화한다. 이는 클러스터 내 파드들이 사용할 네트워크 대역을 설정하는 과정이다.
# 마스터 노드에서
kubeadm init --pod-network-cidr=10.32.0.0/12
# 마스터 노드를 초기화하고 클러스터를 생성한다. 지정된 CIDR 범위는 파드 네트워크에서 사용된다.
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
# kubectl 설정 파일을 사용자 홈 디렉토리에 복사하고 적절한 권한을 설정한다.
5. CNI(Container Network Interface) 설치
Weave Net을 CNI로 설치하여 파드 간 네트워크 통신이 가능하도록 구성한다.(Weave Net이 아닌 다른 걸 사용하는 건 자유)
# 마스터 노드에서
kubectl apply -f "https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml"
# Weave Net CNI를 클러스터에 설치한다. 이 매니페스트 파일은 네트워크 구성을 포함한다.
6. 워커 노드 조인
마스터 노드 초기화 시 생성된 토큰과 해시를 사용하여 워커 노드를 클러스터에 등록한다.
# 워커 노드에서
kubeadm join <master-ip>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
# 워커 노드를 클러스터에 추가한다. 토큰과 해시는 보안 인증에 사용되며, 마스터 노드의 IP에 연결을 시도한다.
7. 연결 확인
# 마스터 노드에서
kubectl get nodes
#NAME STATUS ROLES AGE VERSION
#master Ready control-plane 6m v1.29.11
#worker1 Ready <none> 1m20s v1.29.11
#worker2 Ready <none> 2m42s v1.29.11